package cn.kingfengks.kfexplorer.actions;

import java.io.IOException;

import org.eclipse.core.internal.resources.File;
import org.eclipse.core.internal.resources.Resource;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.internal.core.CompilationUnit;
import org.eclipse.jdt.internal.core.JarPackageFragmentRoot;
import org.eclipse.jdt.internal.core.Openable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;

/**
 * Our sample action implements workbench action delegate. The action proxy will
 * be created by the workbench and shown in the UI. When the user tries to use
 * the action, this delegate will be created and execution will be delegated to
 * it.
 * 
 * @see IWorkbenchWindowActionDelegate
 */
@SuppressWarnings("restriction")
public class SampleAction implements IWorkbenchWindowActionDelegate {
	private IWorkbenchWindow window;
	private static Runtime runtime = Runtime.getRuntime();
	/**
	 * The constructor.
	 */
	public SampleAction() {
	}

	/**
	 * The action has been activated. The argument of the method represents the
	 * 'real' action sitting in the workbench UI.
	 * 
	 * @see IWorkbenchWindowActionDelegate#run
	 */
	public void run(IAction action) {
		TreeSelection sel = (TreeSelection) window.getActivePage()
				.getSelection();
		Object obj = sel.getFirstElement();
		//test
		this.test(action);
		//get path
		IPath path = null;
		if (obj instanceof Openable ) {
			Openable root = (Openable) obj;
			IResource res =  root.getResource();
			if(res==null)
				path = root.getPath();
			else
				path = res.getLocation();
		}else if(obj instanceof Resource){
			Resource res = (Resource)obj;
			path = res.getLocation();
		}else{
			return;
		}
		//trim path if nessesary
		if(obj instanceof JarPackageFragmentRoot ||
				obj instanceof File ||
				obj instanceof CompilationUnit
		)
			path = path.removeLastSegments(1);
		
		try {
			String strPath = path.toOSString();
			runtime.exec("explorer " + strPath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	public void test(IAction action){
		IWorkbenchPage workbench = window.getActivePage();
		workbench.getEditorReferences();
	}
	/**
	 * Selection in the workbench has been changed. We can change the state of
	 * the 'real' action here if we want, but this can only happen after the
	 * delegate has been created.
	 * 
	 * @see IWorkbenchWindowActionDelegate#selectionChanged
	 */
	public void selectionChanged(IAction action, ISelection selection) {
	}

	/**
	 * We can use this method to dispose of any system resources we previously
	 * allocated.
	 * 
	 * @see IWorkbenchWindowActionDelegate#dispose
	 */
	public void dispose() {
	}

	/**
	 * We will cache window object in order to be able to provide parent shell
	 * for the message dialog.
	 * 
	 * @see IWorkbenchWindowActionDelegate#init
	 */
	public void init(IWorkbenchWindow window) {
		this.window = window;
	}
}